package com.evil.application.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.evil.application.convert.DataConvert;
import com.evil.application.mapper.ApplicationFormControlMapper;
import com.evil.application.pojo.dto.form.control.ControlBaseInfoDTO;
import com.evil.application.pojo.dto.form.control.code.ControlDTO;
import com.evil.application.pojo.dto.form.control.save.CopyControlDTO;
import com.evil.application.pojo.entity.ApplicationForm;
import com.evil.application.pojo.entity.ApplicationFormControl;
import com.evil.application.pojo.entity.ApplicationInfo;
import com.evil.common.application.dto.form.control.ControlBaseDTO;
import com.evil.common.application.enums.ApplicationVersionEnum;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 应用表单控件表
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
public interface ApplicationFormControlService extends IService<ApplicationFormControl> {

    @Override
    ApplicationFormControlMapper getBaseMapper();

    // region query ApplicationFormControl

    /**
     * 获取应用表单控件
     *
     * @param id id
     * @return ApplicationFormControl
     */
    ApplicationFormControl findById(Long id);

    /**
     * 获取应用表单控件列表
     *
     * @param ids           ids
     * @param filterDeleted filterDeleted
     * @return ApplicationFormControl列表
     */
    List<ApplicationFormControl> findByControlIds(Collection<Long> ids, boolean filterDeleted);

    /**
     * 获取应用表单控件列表
     *
     * @param formId               formId
     * @param supplySpecialControl 是否补充特殊控件
     * @return ApplicationFormControl列表
     */
    List<ApplicationFormControl> findByFormId(Long formId, boolean supplySpecialControl);

    /**
     * 获取应用表单控件列表
     *
     * @param applicationForm      applicationForm
     * @param supplySpecialControl 是否补充特殊控件
     * @return ApplicationFormControl列表
     */
    List<ApplicationFormControl> findByForm(ApplicationForm applicationForm, boolean supplySpecialControl);

    /**
     * 获取应用表单控件列表
     *
     * @param applicationForm applicationForm
     * @param controlCode     controlCode
     * @return ApplicationFormControl列表
     */
    List<ApplicationFormControl> findByFormAndControlCode(ApplicationForm applicationForm, String controlCode);

    /**
     * 获取应用表单控件列表
     *
     * @param appId                appId
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ApplicationFormControl列表
     */
    List<ApplicationFormControl> findByAppId(Long appId, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);

    /**
     * 获取应用表单控件列表
     *
     * @param applicationInfo      applicationInfo
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ApplicationFormControl列表
     */
    List<ApplicationFormControl> findByApp(ApplicationInfo applicationInfo, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);
    // endregion

    // region query ControlDTO

    /**
     * 获取应用表单控件实体
     *
     * @param id          id
     * @param dataConvert 为null将不会初始化
     * @return ControlDTO
     */
    ControlDTO findDTOByControlId(Long id, DataConvert dataConvert);

    /**
     * 获取应用表单控件实体列表
     *
     * @param ids           ids
     * @param filterDeleted filterDeleted
     * @return ControlDTO列表
     */
    List<ControlDTO> findDTOByControlIds(Collection<Long> ids, boolean filterDeleted);

    /**
     * 获取应用表单控件实体列表
     *
     * @param ids           ids
     * @param filterDeleted filterDeleted
     * @return ControlDTO列表
     */
    Map<Long, ControlDTO> findDTOMapByControlIds(Collection<Long> ids, boolean filterDeleted);

    /**
     * 转换DTO
     *
     * @param controls controls
     * @return ControlDTO 列表
     */
    List<ControlDTO> transDTO(Collection<ApplicationFormControl> controls);

    /**
     * 获取应用表单控件实体列表
     *
     * @param formId               formId
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlDTO列表
     */
    List<ControlDTO> findDTOByFormId(Long formId, boolean supplySpecialControl);

    /**
     * 获取应用表单控件实体列表
     *
     * @param applicationForm      applicationForm
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlDTO列表
     */
    List<ControlDTO> findDTOByForm(ApplicationForm applicationForm, boolean supplySpecialControl);

    /**
     * 获取应用表单控件实体列表
     *
     * @param appId                appId
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlDTO列表
     */
    List<ControlDTO> findDTOByAppId(Long appId, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);

    /**
     * 获取应用表单控件实体列表
     *
     * @param applicationInfo      applicationInfo
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlDTO列表
     */
    List<ControlDTO> findDTOByApp(ApplicationInfo applicationInfo, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);

    /**
     * 获取发布版 控件实体列表（缓存版）
     *
     * @param appId appId
     * @return ControlDTO列表
     */
    List<ControlDTO> appReleaseControlDTOs_Cache(Long appId);

    /**
     * 获取发布版 控件实体列表（缓存版）
     *
     * @param applicationInfo applicationInfo
     * @return ControlDTO列表
     */
    List<ControlDTO> appReleaseControlDTOs_Cache(ApplicationInfo applicationInfo);

    /**
     * 获取发布版 控件实体列表（缓存版）
     *
     * @param applicationInfo applicationInfo
     * @return ControlDTO列表
     */
    Map<Long, ControlDTO> appReleaseControlDTOMap_Cache(ApplicationInfo applicationInfo);

    /**
     * 发布版应用表单控件实体列表
     *
     * @param appId                appId
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlDTO列表
     */
    List<ControlDTO> appReleaseControlDTOs(Long appId, boolean supplySpecialControl);
    // endregion

    // region query ControlBaseDTO

    /**
     * 获取控件基础信息
     *
     * @param controlId controlId
     * @return ControlBaseDTO
     */
    ControlBaseDTO findBaseById(Long controlId);

    /**
     * 获取控件基础信息列表
     *
     * @param controlIds controlIds
     * @return ControlBaseDTO
     */
    List<ControlBaseDTO> findBaseByIds(Collection<Long> controlIds);

    /**
     * 获取控件基础信息列表
     *
     * @param controlIds controlIds
     * @return ControlBaseDTO
     */
    Map<Long, ControlBaseDTO> findBaseMapByIds(Collection<Long> controlIds);

    /**
     * 获取控件基础信息列表
     *
     * @param formIds              formIds
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseDTO
     */
    List<ControlBaseDTO> findBaseByFormIds(Collection<Long> formIds, boolean supplySpecialControl);

    /**
     * 获取控件基础信息列表
     *
     * @param formId               formId
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseDTO
     */
    List<ControlBaseDTO> findBaseByFormId(Long formId, boolean supplySpecialControl);

    /**
     * 获取控件基础信息列表
     *
     * @param form                 form
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseDTO
     */
    List<ControlBaseDTO> findBaseByForm(ApplicationForm form, boolean supplySpecialControl);

    /**
     * 获取控件基础信息列表
     *
     * @param form        form
     * @param controlCode controlCode
     * @return ControlBaseDTO
     */
    List<ControlBaseDTO> findBaseByForm(ApplicationForm form, String controlCode);

    /**
     * 获取控件基础信息列表
     *
     * @param appId                appId
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseDTO
     */
    List<ControlBaseDTO> findBaseByAppId(Long appId, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);

    /**
     * 获取控件基础信息列表
     *
     * @param app                  app
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseDTO
     */
    List<ControlBaseDTO> findReleaseBaseByApp(ApplicationInfo app, boolean supplySpecialControl);

    /**
     * 获取控件基础信息列表
     *
     * @param app                  app
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseDTO
     */
    Map<Long, ControlBaseDTO> findReleaseBaseMapByApp(ApplicationInfo app, boolean supplySpecialControl);

    /**
     * 获取控件基础信息列表
     *
     * @param app                  app
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseDTO
     */
    List<ControlBaseDTO> findBaseByApp(ApplicationInfo app, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param ids ids
     * @return ControlBaseInfoDTO列表
     */
    Map<Long, String> controlCodeMap(Collection<Long> ids);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param formId               formId
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    Map<Long, String> controlCodeMap(Long formId, boolean supplySpecialControl);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param formIds              formIds
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    Map<Long, String> controlCodeMap(Collection<Long> formIds, boolean supplySpecialControl);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param appId                appId
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    Map<Long, String> controlCodeMap(Long appId, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);
    // endregion

    // region query ControlBaseInfoDTO

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param ids ids
     * @return ControlBaseInfoDTO列表
     */
    List<ControlBaseInfoDTO> findBaseInfoByControlIds(Collection<Long> ids);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param ids ids
     * @return ControlBaseInfoDTO列表
     */
    Map<Long, ControlBaseInfoDTO> findBaseInfoMapByControlIds(Collection<Long> ids);

    /**
     * 转换Base
     *
     * @param controls controls
     * @return ControlBaseInfoDTO 列表
     */
    List<ControlBaseInfoDTO> transBaseInfo(Collection<ApplicationFormControl> controls);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param formId               formId
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    List<ControlBaseInfoDTO> findBaseInfoByFormId(Long formId, boolean supplySpecialControl);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param form                 form
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    List<ControlBaseInfoDTO> findBaseInfoByForm(ApplicationForm form, boolean supplySpecialControl);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param form        form
     * @param controlCode controlCode
     * @return ControlBaseInfoDTO列表
     */
    List<ControlBaseInfoDTO> findBaseInfoByForm(ApplicationForm form, String controlCode);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param appId                appId
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    List<ControlBaseInfoDTO> findBaseInfoByAppId(Long appId, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param appId                appId
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    Map<Long, ControlBaseInfoDTO> findBaseInfoMapByAppId(Long appId, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param app                  app
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    List<ControlBaseInfoDTO> findReleaseBaseInfoByApp(ApplicationInfo app, boolean supplySpecialControl);

    /**
     * 获取应用表单控件基础信息列表
     *
     * @param app                  app
     * @param versionEnum          versionEnum
     * @param supplySpecialControl 是否补充特殊控件
     * @return ControlBaseInfoDTO列表
     */
    List<ControlBaseInfoDTO> findBaseInfoByApp(ApplicationInfo app, ApplicationVersionEnum versionEnum, boolean supplySpecialControl);
    // endregion

    /**
     * 保存表单控件
     *
     * @param form     form
     * @param controls controls
     */
    void modifyControls(ApplicationForm form, List<ControlDTO> controls);

    /**
     * 复制表单控件
     *
     * @param targetApp    targetApp
     * @param source       source
     * @param target       target
     * @param updateSource 是否更新源映射
     * @return CopyControlRespDTO
     */
    CopyControlDTO copyControls(ApplicationInfo targetApp, ApplicationForm source, ApplicationForm target, boolean updateSource);

    /**
     * 更新 控件 源控件id信息
     *
     * @param controlIdMap       版本控件id映射整合
     * @param controlSourceIdMap 版本源控件id映射整合
     */
    void modifyControlSourceId(Map<Long, Long> controlIdMap, Map<Long, Long> controlSourceIdMap);

    /**
     * 删除表单控件
     *
     * @param form form
     */
    void deleteFormControl(ApplicationForm form);

}
